package logica.fachada;

import java.sql.SQLException;

import logica.DAO.DAOConnection;
import logica.servicios.ServAlmacen;
import logica.servicios.ServCliente;
import logica.servicios.ServFamilia;
import logica.servicios.ServInventarioYMovimientos;
import logica.servicios.ServProducto;
import logica.servicios.ServProveedor;
import logica.servicios.ServUsuario;
import objetosNegocio.Almacen;
import objetosNegocio.Cliente;
import objetosNegocio.Familia;
import objetosNegocio.Inventario;
import objetosNegocio.LineaInventario;
import objetosNegocio.ListaAlmacenes;
import objetosNegocio.ListaClientes;
import objetosNegocio.ListaFamilias;
import objetosNegocio.ListaMovimientos;
import objetosNegocio.ListaProductos;
import objetosNegocio.ListaProveedores;
import objetosNegocio.ListaUsuarios;
import objetosNegocio.Movimiento;
import objetosNegocio.Producto;
import objetosNegocio.Proveedor;
import objetosNegocio.Session;
import objetosNegocio.Usuario;
import objetosNegocio.excepciones.SecurException;
import objetosNegocio.excepciones.StockException;

public class GESAL implements InterfazGESAL {
	
	//ATRIBUTOS
	private DAOConnection connection = null;

	private ServAlmacen serviciosAlmacen=null;
	private ServCliente serviciosCliente=null;
	private ServProveedor serviciosProveedor=null;
	private ServFamilia serviciosFamilia=null;
	private ServProducto serviciosProducto=null;
	private ServInventarioYMovimientos serviciosInventYMovim=null; 
	private ServUsuario serviciosUsuario=null;
	
	
	public GESAL(){
		connection=new DAOConnection();
	}
	
	//--------------------------------------
	//Operaciones de usuario
	//--------------------------------------
	public boolean Login (String aliasUsuario, String password) throws SQLException,SecurException{
		boolean login=false;
		
		if (connection.Login(aliasUsuario, password)){
			login=true;
			registrarServicios(); //se registran los servicios para que puedan usarse desde la fachada
		}
		return login;
	}
	
	public void Logoff () throws SQLException{
		connection.Logoff();
		liberarServicios();
	}
	
	public Session getUsuarioLogado(){
		return connection.getSession();
	}
	
	
	private void registrarServicios(){
		//Instanciar los servicios disponibles
		if (serviciosAlmacen==null) 		serviciosAlmacen = new ServAlmacen(connection);
		if (serviciosCliente==null) 		serviciosCliente = new ServCliente(connection);
		if (serviciosProveedor==null) 		serviciosProveedor = new ServProveedor(connection);
		if (serviciosFamilia==null) 		serviciosFamilia = new ServFamilia(connection);
		if (serviciosProducto==null) 		serviciosProducto = new ServProducto(connection);
		if (serviciosInventYMovim==null) 	serviciosInventYMovim = new ServInventarioYMovimientos(connection);
		if (serviciosUsuario==null) 		serviciosUsuario = new ServUsuario(connection);
	}
	
	private void liberarServicios(){
		serviciosAlmacen=null;
		serviciosCliente=null;
		serviciosProveedor=null;
		serviciosFamilia=null;
		serviciosProducto=null;
		serviciosInventYMovim=null;
		serviciosUsuario=null;
	}
	
	
	//--------------------------------------
	//Operaciones <ALMACEN>
	//--------------------------------------
	@Override
	public boolean AltaAlmacen(Almacen almacen) throws SQLException,SecurException {
		return serviciosAlmacen.insertar(almacen);

	}
	
	@Override
	public boolean ModificarAlmacen (Almacen almacen) throws SQLException,SecurException {
		return serviciosAlmacen.modificar(almacen);
	}
	
	@Override
	public boolean darDeBajaAlmacen (int codigo) throws SQLException,SecurException {
		return serviciosAlmacen.darDeBaja(codigo);
	}
	
	@Override
	public Almacen obtenerAlmacen (int codigo) throws SQLException,SecurException{
		return serviciosAlmacen.obtener(codigo);
	}

	@Override
	public ListaAlmacenes obtenerListadoAlmacenes() throws SQLException,SecurException {
		return serviciosAlmacen.obtenerListado();
	}
	
	@Override
	public ListaAlmacenes obtenerListadoAlmacenesActivos() throws SQLException,SecurException {
		return serviciosAlmacen.obtenerListadoActivos();
	}


	
	//--------------------------------------
	//Operaciones <CLIENTE>
	//--------------------------------------
	@Override
	public boolean AltaCliente(Cliente cliente) throws SQLException,SecurException {
		return serviciosCliente.insertar(cliente);
	}

	@Override
	public boolean ModificarCliente(Cliente cliente) throws SQLException,SecurException {
		return serviciosCliente.modificar(cliente);
	}

	@Override
	public boolean darDeBajaCliente(int codigo) throws SQLException,SecurException {
		return serviciosCliente.darDeBaja(codigo);
	}

	@Override
	public Cliente obtenerCliente(int codigo) throws SQLException,SecurException {
		return serviciosCliente.obtener(codigo);
	}

	@Override
	public ListaClientes obtenerListadoClientes() throws SQLException,SecurException {
		return serviciosCliente.obtenerListado();
	}

	@Override
	public ListaClientes obtenerListadoClientesActivos() throws SQLException,SecurException {
		return serviciosCliente.obtenerListadoActivos();
	}


	
	//--------------------------------------
	//Operaciones <PROVEEDOR>
	//--------------------------------------
	@Override
	public boolean AltaProveedor(Proveedor proveedor) throws SQLException,SecurException {
		return serviciosProveedor.insertar(proveedor);
	}

	@Override
	public boolean ModificarProveedor(Proveedor proveedor) throws SQLException,SecurException {
		return serviciosProveedor.modificar(proveedor);
	}

	@Override
	public boolean darDeBajaProveedor(int codigo) throws SQLException,SecurException {
		return serviciosProveedor.darDeBaja(codigo);
	}

	@Override
	public Proveedor obtenerProveedor(int codigo) throws SQLException,SecurException {
		return serviciosProveedor.obtener(codigo);
	}

	@Override
	public ListaProveedores obtenerListadoProveedores() throws SQLException,SecurException {
		return serviciosProveedor.obtenerListado();
	}

	@Override
	public ListaProveedores obtenerListadoProveedoresActivos() throws SQLException,SecurException {
		return serviciosProveedor.obtenerListadoActivos();
	}

	
	
	//--------------------------------------
	//Operaciones <FAMILIA>
	//--------------------------------------
	@Override
	public boolean AltaFamilia(Familia familia) throws SQLException,SecurException {
		return serviciosFamilia.insertar(familia);
	}

	@Override
	public boolean ModificarFamilia(Familia familia) throws SQLException,SecurException {
		return serviciosFamilia.modificar(familia);
	}

	@Override
	public boolean darDeBajaFamilia(int codigo) throws SQLException,SecurException {
		return serviciosFamilia.darDeBaja(codigo);
	}

	@Override
	public Familia obtenerFamilia(int codigo) throws SQLException,SecurException {
		return serviciosFamilia.obtener(codigo);
	}

	@Override
	public ListaFamilias obtenerListadoFamilias() throws SQLException,SecurException {
		return serviciosFamilia.obtenerListado();
	}

	@Override
	public ListaFamilias obtenerListadoFamiliasActivas() throws SQLException,SecurException {
		return serviciosFamilia.obtenerListadoActivos();
	}
	
	
	
	//--------------------------------------
	//Operaciones <PRODUCTO>
	//--------------------------------------
	@Override
	public boolean AltaProducto(Producto producto) throws  SQLException,SecurException{
		return serviciosProducto.insertar(producto);
	}

	@Override
	public boolean ModificarProducto(Producto producto) throws SQLException,SecurException {
		return serviciosProducto.modificar(producto);
	}

	@Override
	public boolean darDeBajaProducto(int codigo) throws SQLException,SecurException {
		return serviciosProducto.darDeBaja(codigo);
	}

	@Override
	public Producto obtenerProducto(int codigo) throws SQLException,SecurException {
		return serviciosProducto.obtener(codigo);
	}

	@Override
	public ListaProductos obtenerListadoProductos() throws SQLException,SecurException {
		return serviciosProducto.obtenerListado();
	}
	
	@Override
	public ListaProductos obtenerListadoProductosActivos() throws SQLException,SecurException {
		return serviciosProducto.obtenerListadoActivos();
	}


	//--------------------------------------
	//Operaciones <USUARIO>
	//--------------------------------------
	@Override
	public boolean AltaUsuario(Usuario usuario) throws SQLException,SecurException {
		return serviciosUsuario.insertar(usuario);
	}

	@Override
	public boolean darDeBajaUsuario(int idUsuario) throws SQLException,SecurException {
		return serviciosUsuario.darDeBaja(idUsuario);
	}

	@Override
	public boolean ModificarUsuario(Usuario usuario) throws SQLException,SecurException {
		return serviciosUsuario.modificar(usuario);
	}

	@Override
	public Usuario obtenerUsuario(int idUsuario) throws SQLException,SecurException {
		return serviciosUsuario.obtener(idUsuario);
	}

	@Override
	public ListaUsuarios obtenerListadoUsuarios() throws SQLException,SecurException {
		return serviciosUsuario.obtenerListado();
	}

	@Override
	public ListaUsuarios obtenerListadoUsuariosActivos() throws SQLException,SecurException {
		return serviciosUsuario.obtenerListadoActivos();
	}

	@Override
	public boolean modificarPasswordUsuario(String aliasUsuario, String nuevaPassword) throws SQLException,SecurException {
		return serviciosUsuario.modificarPassword(aliasUsuario, nuevaPassword);
	}

	@Override
	public boolean validarPasswordUsuario(String aliasUsuario, String password) throws SQLException,SecurException {
		return serviciosUsuario.validarPassword(aliasUsuario, password);
	}
	
	
	
	
	
	//-------------------------------------------
	//Operaciones < INVENTARIO Y MOVIMIENTOS > 
	//-------------------------------------------
	
	@Override
	public boolean AltaLineaInventario(LineaInventario lineaInventario) throws SQLException,SecurException {
		return serviciosInventYMovim.insertarLineaInventario(lineaInventario);
	}

	@Override
	public boolean ModificarLineaInventario(LineaInventario lineaInventario) throws SQLException,SecurException {
		return serviciosInventYMovim.modificarLineaInventario(lineaInventario);
	}

	@Override
	public LineaInventario obtenerLineaInventario(int idAlmacen, int idProducto) throws SQLException,SecurException {
		return serviciosInventYMovim.obtenerLineaInventario(idAlmacen, idProducto);
	}

	@Override
	public Inventario obtenerInventario_ALLProductos_Almacen(int idAlmacen) throws SQLException,SecurException {
		return serviciosInventYMovim.obtenerInventario_ALLProductos_Almacen(idAlmacen);
	}

	@Override
	public Inventario obtenerInventario_ProductosActivos_Almacen(int idAlmacen) throws SQLException,SecurException {
		return serviciosInventYMovim.obtenerInventario_ProductosActivos_Almacen(idAlmacen);
	}

	@Override
	public boolean insertarMovimientoDeEntrada(Movimiento datos) throws SQLException, SecurException {
		return serviciosInventYMovim.insertarMovimientoDeEntrada(datos);
	}

	@Override
	public boolean insertarMovimientoDeSalida(Movimiento datos) throws SQLException, SecurException, StockException {
		return serviciosInventYMovim.insertarMovimientoDeSalida(datos);
	}

	@Override
	public boolean insertarMovimientoDeInventario(Movimiento datos) throws SQLException, SecurException {
		return serviciosInventYMovim.insertarMovimientoDeInventario(datos);
	}

	
	@Override
	public ListaMovimientos listadoMovimientosFecha(String fechaIni, String fechaFin) throws SQLException, SecurException {
		return serviciosInventYMovim.listadoMovimientosFecha(fechaIni, fechaFin);
	}

	@Override
	public ListaMovimientos listadoMovimientosUsuario(int idUsuario) throws SQLException, SecurException {
		return serviciosInventYMovim.listadoMovimientosUsuario(idUsuario);
	}

	@Override
	public ListaMovimientos listadoMovimientosCliente(int idCliente) throws SQLException, SecurException {
		return serviciosInventYMovim.listadoMovimientosCliente(idCliente);
	}

	@Override
	public ListaMovimientos listadoMovimientosProveedor(int idProveedor) throws SQLException, SecurException {
		return serviciosInventYMovim.listadoMovimientosProveedor(idProveedor);
	}

	@Override
	public ListaMovimientos listadoMovimientosAlmacenDestino(int idAlmacen)	throws SQLException, SecurException {
		return serviciosInventYMovim.listadoMovimientosAlmacenDestino(idAlmacen);
	}

}
